Celem niniejszego raportu jest analiza czynników wpływających na pojemność superkondensatorów oraz budowa modelu predykcyjnego opartego na danych z 925 wierszy. Zbiór danych poddano czyszczeniu, usunięto zbędne zmienne tekstowe, zakodowano konfigurację ogniwa oraz uzupełniono liczne braki, aby umożliwić dalszą analizę. W części eksploracyjnej zbadano rozkłady wartości, zależności między atrybutami oraz występowanie braków, co pozwoliło lepiej zrozumieć strukturę danych. Przeprowadzono analizę korelacji oraz wizualizacje ilustrujące główne trendy dotyczące m.in. gęstości prądu, powierzchni właściwej i składu materiałowego. Następnie wykonano analizę skupień w celu identyfikacji grup materiałów o podobnych właściwościach oraz zbudowano model predykcyjny metodą Random Forest, oceniając jego skuteczność i najważniejsze cechy wpływające na wynik.
library(ggcorrplot)
library(tidyr)
library(readr)
library(dplyr)
library(ggtern)
library(ggplot2)
library(janitor)
library(corrplot)
library(plotly)
library(caret)
library(factoextra)
library(fpc)
library(NbClust)
library(viridis)
set.seed(1234)
raw_data <- read_csv("data.csv")
## Rows: 925 Columns: 21
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): Ref., Limits of Potential Window (V), Electrode Configuration, Ele...
## dbl (16): Lower Limit of Potential Window (V), Upper Limit of Potential Wind...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(raw_data)
## Rows: 925
## Columns: 21
## $ Ref. <chr> "DOI: 10.1039/c7ta03…
## $ `Limits of Potential Window (V)` <chr> "0 to 0.8", "0 to 1"…
## $ `Lower Limit of Potential Window (V)` <dbl> 0.0, 0.0, 0.0, 0.0, …
## $ `Upper Limit of Potential Window (V)` <dbl> 0.80, 1.00, 1.00, 1.…
## $ `Potential Window (V)` <dbl> 0.80, 1.00, 1.00, 1.…
## $ `Current Density (A/g)` <dbl> 1.0, 1.0, 2.0, 5.0, …
## $ `Capacitance (F/g)` <dbl> 680, 367, 338, 283, …
## $ `Specific Surface Area (m^2/g)` <dbl> 186.3, 537.0, 537.0,…
## $ `Charge Transfer Resistance (Rct) (ohm)` <dbl> NA, 6.1, 6.1, 6.1, 6…
## $ `Equivalent Series Resistance (Rs) (ohm)` <dbl> 7.70, 1.95, 1.95, 1.…
## $ `Electrode Configuration` <chr> "CNF/RGO/moOxNy", "s…
## $ `Pore Size (nm)` <dbl> NA, NA, NA, NA, NA, …
## $ `Pore Volume (cm^3/g)` <dbl> NA, NA, NA, NA, NA, …
## $ `Ratio of ID/IG` <dbl> 1.450, 1.280, 1.280,…
## $ `N at%` <dbl> 2.1, 0.0, 0.0, 0.0, …
## $ `C at%` <dbl> NA, 85.6, 85.6, 85.6…
## $ `O at%` <dbl> NA, 9.1, 9.1, 9.1, 9…
## $ `Electrolyte Chemical Formula` <chr> "H2SO4", "KOH", "KOH…
## $ `Electrolyte Ionic Conductivity` <dbl> 7, 6, 6, 6, 6, 6, NA…
## $ `Electrolyte Concentration (M)` <dbl> 1.0, 6.0, 6.0, 6.0, …
## $ `Cell Configuration (three/two electrode system)` <chr> "three-electrode sys…
head(raw_data)
data <- raw_data %>%
clean_names()
names(data)
## [1] "ref"
## [2] "limits_of_potential_window_v"
## [3] "lower_limit_of_potential_window_v"
## [4] "upper_limit_of_potential_window_v"
## [5] "potential_window_v"
## [6] "current_density_a_g"
## [7] "capacitance_f_g"
## [8] "specific_surface_area_m_2_g"
## [9] "charge_transfer_resistance_rct_ohm"
## [10] "equivalent_series_resistance_rs_ohm"
## [11] "electrode_configuration"
## [12] "pore_size_nm"
## [13] "pore_volume_cm_3_g"
## [14] "ratio_of_id_ig"
## [15] "n_at_percent"
## [16] "c_at_percent"
## [17] "o_at_percent"
## [18] "electrolyte_chemical_formula"
## [19] "electrolyte_ionic_conductivity"
## [20] "electrolyte_concentration_m"
## [21] "cell_configuration_three_two_electrode_system"
Nazwy kolumn są porządkowane do postaci snake_case, co ułatwia późniejszą pracę z danymi.
char_cols <- names(data)[sapply(data, is.character)]
char_cols_keep <- "cell_configuration_three_two_electrode_system"
data <- data %>%
select(-all_of(setdiff(char_cols, char_cols_keep)))
data <- data %>%
mutate(
cell_configuration_three_two_electrode_system_encoded =
as.numeric(as.factor(cell_configuration_three_two_electrode_system))
)
data <- data%>%select(-cell_configuration_three_two_electrode_system,-potential_window_v)
W tej części usunięto z danych wszystkie zmienne tekstowe poza informacją o konfiguracji ogniwa, ponieważ pozostałe kolumny znakowe nie wnosiły wartości do dalszej analizy. Następnie dokonano kodowania etykietowego konfiguracji ogniwa ze względu na tylko dwa systemy elekrod. Dodatkowo usunięto zmienną potential_window_v, aby uniknąć redundancji, ponieważ jest to różnica między Lower Limit of Potential Window (V) oraz Upper Limit of Potential Window (V).
missing_tbl <- sapply(data, function(x) sum(is.na(x))) %>%
sort(decreasing = TRUE)
missing_tbl
## charge_transfer_resistance_rct_ohm
## 786
## equivalent_series_resistance_rs_ohm
## 772
## pore_size_nm
## 769
## pore_volume_cm_3_g
## 729
## o_at_percent
## 703
## c_at_percent
## 699
## n_at_percent
## 690
## ratio_of_id_ig
## 596
## specific_surface_area_m_2_g
## 572
## electrolyte_ionic_conductivity
## 99
## electrolyte_concentration_m
## 62
## capacitance_f_g
## 17
## current_density_a_g
## 16
## cell_configuration_three_two_electrode_system_encoded
## 14
## lower_limit_of_potential_window_v
## 4
## upper_limit_of_potential_window_v
## 4
missing_df <- tibble(
variable = names(missing_tbl),
missing = as.numeric(missing_tbl)
)
ggplot(missing_df, aes(x = reorder(variable, missing), y = missing)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
x = "Zmienna",
y = "Liczba brakujących wartości",
title = "Brakujące dane w zbiorze"
)
Wykres braków danych pokazuje wyraźnie, że największe ubytki dotyczą parametrów związanych z opornością oraz strukturą porowatości materiałów. Brakuje przede wszystkim informacji o oporze transferu ładunku (Rct), szeregowym oporze wewnętrznym (Rs), rozmiarze porów i objętości porów. Dane dotyczące składu pierwiastkowego (N, C, O) również pojawiają się w sposób niepełny, co ogranicza możliwości pełnej analizy chemicznej.
data[data == ""] <- NA
data <- data %>% mutate(across(everything(), ~replace_na(., 0)))
Wszystkie brakujące wartości zostały zastąpione zerami, aby umożliwić dalszą obróbkę danych i uniknąć problemów podczas analiz. Przyjęto założenie, że jeśli dana wartość nie została podana, to można traktować ją jako równą zero. Warto jednak podkreślić, że w wielu kolumnach braków było bardzo dużo, co pokazuje, że zbiór danych nie został przygotowany w sposób kompletny i może wymagać ostrożności przy interpretacji wyników.
summary(data)
## lower_limit_of_potential_window_v upper_limit_of_potential_window_v
## Min. :-1.1000 Min. :-0.2000
## 1st Qu.:-0.3000 1st Qu.: 0.4000
## Median : 0.0000 Median : 0.6000
## Mean :-0.2333 Mean : 0.6274
## 3rd Qu.: 0.0000 3rd Qu.: 0.8000
## Max. : 0.2000 Max. : 3.5000
## current_density_a_g capacitance_f_g specific_surface_area_m_2_g
## Min. : 0.000 Min. : 0.0 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 143.5 1st Qu.: 0.00
## Median : 2.000 Median : 255.0 Median : 0.00
## Mean : 5.756 Mean : 407.9 Mean : 159.30
## 3rd Qu.: 5.000 3rd Qu.: 493.6 3rd Qu.: 83.11
## Max. :200.000 Max. :3344.1 Max. :2400.00
## charge_transfer_resistance_rct_ohm equivalent_series_resistance_rs_ohm
## Min. : 0.0000 Min. : 0.0000
## 1st Qu.: 0.0000 1st Qu.: 0.0000
## Median : 0.0000 Median : 0.0000
## Mean : 0.4581 Mean : 0.2649
## 3rd Qu.: 0.0000 3rd Qu.: 0.0000
## Max. :24.2000 Max. :17.5000
## pore_size_nm pore_volume_cm_3_g ratio_of_id_ig n_at_percent
## Min. : 0.000 Min. :0.0000 Min. :0.0000 Min. : 0.000
## 1st Qu.: 0.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.: 0.000
## Median : 0.000 Median :0.0000 Median :0.0000 Median : 0.000
## Mean : 1.453 Mean :0.1029 Mean :0.3986 Mean : 0.635
## 3rd Qu.: 0.000 3rd Qu.:0.0000 3rd Qu.:1.0000 3rd Qu.: 0.000
## Max. :44.131 Max. :2.3500 Max. :2.9000 Max. :23.820
## c_at_percent o_at_percent electrolyte_ionic_conductivity
## Min. : 0.00 Min. : 0.000 Min. :0.000
## 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.:5.000
## Median : 0.00 Median : 0.000 Median :6.000
## Mean :16.25 Mean : 4.602 Mean :5.185
## 3rd Qu.: 0.00 3rd Qu.: 0.000 3rd Qu.:7.000
## Max. :98.10 Max. :54.280 Max. :8.000
## electrolyte_concentration_m
## Min. :0.000
## 1st Qu.:1.000
## Median :1.000
## Mean :2.403
## 3rd Qu.:6.000
## Max. :6.000
## cell_configuration_three_two_electrode_system_encoded
## Min. :0.000
## 1st Qu.:1.000
## Median :1.000
## Mean :1.181
## 3rd Qu.:1.000
## Max. :2.000
for (col in names(data)) {
p_hist <- ggplot(data, aes_string(x = col)) +
geom_density(fill = "steelblue", color = "white") +
theme_minimal() +
labs(
title = paste("Gęstość wartości dla :", col),
x = col,
y = "Liczność"
)
print(p_hist)
}
Rozkłady wartości pokazują dużą zmienność danych oraz liczne braki w wielu zmiennych, co utrudnia jednoznaczną interpretację wyników. Wiele parametrów ma rozkład silnie skośny — większość obserwacji skupia się na niskich wartościach, a wysokie pojawiają się rzadko. Dla analityka oznacza to konieczność ostrożnego podejścia do dalszych analiz, ponieważ niepełność i nierównomierne rozłożenie danych mogą wpływać na wiarygodność wniosków i modeli predykcyjnych.
corr_vars <- data
corr_matrix <- cor(corr_vars)
corr_matrix
## lower_limit_of_potential_window_v
## lower_limit_of_potential_window_v 1.00000000
## upper_limit_of_potential_window_v 0.63050009
## current_density_a_g 0.04063774
## capacitance_f_g 0.17218894
## specific_surface_area_m_2_g -0.01938885
## charge_transfer_resistance_rct_ohm -0.05098065
## equivalent_series_resistance_rs_ohm -0.07424578
## pore_size_nm -0.12148153
## pore_volume_cm_3_g -0.15716357
## ratio_of_id_ig -0.09219450
## n_at_percent -0.07713330
## c_at_percent -0.18891532
## o_at_percent -0.13713933
## electrolyte_ionic_conductivity 0.11238299
## electrolyte_concentration_m -0.24850914
## cell_configuration_three_two_electrode_system_encoded 0.22442690
## upper_limit_of_potential_window_v
## lower_limit_of_potential_window_v 0.630500088
## upper_limit_of_potential_window_v 1.000000000
## current_density_a_g 0.028161951
## capacitance_f_g -0.104759952
## specific_surface_area_m_2_g 0.304761888
## charge_transfer_resistance_rct_ohm 0.008468736
## equivalent_series_resistance_rs_ohm 0.046674443
## pore_size_nm -0.095671653
## pore_volume_cm_3_g 0.075519966
## ratio_of_id_ig -0.016637044
## n_at_percent -0.044978633
## c_at_percent 0.124119724
## o_at_percent -0.086430282
## electrolyte_ionic_conductivity 0.083388496
## electrolyte_concentration_m -0.296626252
## cell_configuration_three_two_electrode_system_encoded 0.450469081
## current_density_a_g
## lower_limit_of_potential_window_v 0.040637737
## upper_limit_of_potential_window_v 0.028161951
## current_density_a_g 1.000000000
## capacitance_f_g 0.003668344
## specific_surface_area_m_2_g 0.080323102
## charge_transfer_resistance_rct_ohm -0.041826102
## equivalent_series_resistance_rs_ohm -0.016796777
## pore_size_nm -0.046987602
## pore_volume_cm_3_g 0.059111785
## ratio_of_id_ig -0.051410953
## n_at_percent -0.011777917
## c_at_percent -0.039843222
## o_at_percent -0.006460292
## electrolyte_ionic_conductivity -0.069069899
## electrolyte_concentration_m 0.054069337
## cell_configuration_three_two_electrode_system_encoded 0.005226627
## capacitance_f_g
## lower_limit_of_potential_window_v 0.172188943
## upper_limit_of_potential_window_v -0.104759952
## current_density_a_g 0.003668344
## capacitance_f_g 1.000000000
## specific_surface_area_m_2_g -0.166651829
## charge_transfer_resistance_rct_ohm -0.071988544
## equivalent_series_resistance_rs_ohm -0.053998611
## pore_size_nm -0.085612879
## pore_volume_cm_3_g -0.087206242
## ratio_of_id_ig -0.059339700
## n_at_percent 0.033879041
## c_at_percent -0.117738588
## o_at_percent 0.104617077
## electrolyte_ionic_conductivity 0.064289883
## electrolyte_concentration_m 0.050316863
## cell_configuration_three_two_electrode_system_encoded -0.177386448
## specific_surface_area_m_2_g
## lower_limit_of_potential_window_v -0.019388854
## upper_limit_of_potential_window_v 0.304761888
## current_density_a_g 0.080323102
## capacitance_f_g -0.166651829
## specific_surface_area_m_2_g 1.000000000
## charge_transfer_resistance_rct_ohm -0.011098820
## equivalent_series_resistance_rs_ohm 0.059119315
## pore_size_nm 0.053501765
## pore_volume_cm_3_g 0.441080212
## ratio_of_id_ig -0.007104682
## n_at_percent 0.015221388
## c_at_percent 0.255758903
## o_at_percent -0.017657860
## electrolyte_ionic_conductivity -0.017146514
## electrolyte_concentration_m 0.087485006
## cell_configuration_three_two_electrode_system_encoded 0.211538077
## charge_transfer_resistance_rct_ohm
## lower_limit_of_potential_window_v -0.0509806515
## upper_limit_of_potential_window_v 0.0084687365
## current_density_a_g -0.0418261023
## capacitance_f_g -0.0719885435
## specific_surface_area_m_2_g -0.0110988199
## charge_transfer_resistance_rct_ohm 1.0000000000
## equivalent_series_resistance_rs_ohm 0.6079357619
## pore_size_nm 0.0943174653
## pore_volume_cm_3_g -0.0395178752
## ratio_of_id_ig 0.1401227615
## n_at_percent -0.0009477786
## c_at_percent 0.1525767183
## o_at_percent 0.2726497683
## electrolyte_ionic_conductivity 0.0472682103
## electrolyte_concentration_m -0.1048152126
## cell_configuration_three_two_electrode_system_encoded -0.0709667404
## equivalent_series_resistance_rs_ohm
## lower_limit_of_potential_window_v -0.07424578
## upper_limit_of_potential_window_v 0.04667444
## current_density_a_g -0.01679678
## capacitance_f_g -0.05399861
## specific_surface_area_m_2_g 0.05911932
## charge_transfer_resistance_rct_ohm 0.60793576
## equivalent_series_resistance_rs_ohm 1.00000000
## pore_size_nm 0.03656004
## pore_volume_cm_3_g 0.04581745
## ratio_of_id_ig 0.11689204
## n_at_percent 0.02432332
## c_at_percent 0.16532879
## o_at_percent 0.27053126
## electrolyte_ionic_conductivity 0.09384396
## electrolyte_concentration_m -0.08843116
## cell_configuration_three_two_electrode_system_encoded 0.07830807
## pore_size_nm
## lower_limit_of_potential_window_v -0.121481531
## upper_limit_of_potential_window_v -0.095671653
## current_density_a_g -0.046987602
## capacitance_f_g -0.085612879
## specific_surface_area_m_2_g 0.053501765
## charge_transfer_resistance_rct_ohm 0.094317465
## equivalent_series_resistance_rs_ohm 0.036560038
## pore_size_nm 1.000000000
## pore_volume_cm_3_g 0.229027388
## ratio_of_id_ig -0.028430353
## n_at_percent -0.058182358
## c_at_percent -0.006432067
## o_at_percent 0.012520595
## electrolyte_ionic_conductivity -0.078837487
## electrolyte_concentration_m -0.014765050
## cell_configuration_three_two_electrode_system_encoded -0.020538806
## pore_volume_cm_3_g
## lower_limit_of_potential_window_v -0.157163571
## upper_limit_of_potential_window_v 0.075519966
## current_density_a_g 0.059111785
## capacitance_f_g -0.087206242
## specific_surface_area_m_2_g 0.441080212
## charge_transfer_resistance_rct_ohm -0.039517875
## equivalent_series_resistance_rs_ohm 0.045817455
## pore_size_nm 0.229027388
## pore_volume_cm_3_g 1.000000000
## ratio_of_id_ig -0.006598889
## n_at_percent 0.096703485
## c_at_percent 0.168067613
## o_at_percent -0.018898090
## electrolyte_ionic_conductivity -0.093947644
## electrolyte_concentration_m 0.191900082
## cell_configuration_three_two_electrode_system_encoded 0.102044281
## ratio_of_id_ig
## lower_limit_of_potential_window_v -0.092194501
## upper_limit_of_potential_window_v -0.016637044
## current_density_a_g -0.051410953
## capacitance_f_g -0.059339700
## specific_surface_area_m_2_g -0.007104682
## charge_transfer_resistance_rct_ohm 0.140122762
## equivalent_series_resistance_rs_ohm 0.116892044
## pore_size_nm -0.028430353
## pore_volume_cm_3_g -0.006598889
## ratio_of_id_ig 1.000000000
## n_at_percent 0.023648243
## c_at_percent 0.106615045
## o_at_percent 0.054662567
## electrolyte_ionic_conductivity 0.186849884
## electrolyte_concentration_m 0.050157445
## cell_configuration_three_two_electrode_system_encoded 0.048310043
## n_at_percent
## lower_limit_of_potential_window_v -0.0771332968
## upper_limit_of_potential_window_v -0.0449786330
## current_density_a_g -0.0117779174
## capacitance_f_g 0.0338790412
## specific_surface_area_m_2_g 0.0152213881
## charge_transfer_resistance_rct_ohm -0.0009477786
## equivalent_series_resistance_rs_ohm 0.0243233190
## pore_size_nm -0.0581823583
## pore_volume_cm_3_g 0.0967034850
## ratio_of_id_ig 0.0236482429
## n_at_percent 1.0000000000
## c_at_percent 0.3565514005
## o_at_percent 0.2468826903
## electrolyte_ionic_conductivity -0.0989913218
## electrolyte_concentration_m -0.0214021493
## cell_configuration_three_two_electrode_system_encoded -0.0348339481
## c_at_percent o_at_percent
## lower_limit_of_potential_window_v -0.188915315 -0.137139325
## upper_limit_of_potential_window_v 0.124119724 -0.086430282
## current_density_a_g -0.039843222 -0.006460292
## capacitance_f_g -0.117738588 0.104617077
## specific_surface_area_m_2_g 0.255758903 -0.017657860
## charge_transfer_resistance_rct_ohm 0.152576718 0.272649768
## equivalent_series_resistance_rs_ohm 0.165328787 0.270531258
## pore_size_nm -0.006432067 0.012520595
## pore_volume_cm_3_g 0.168067613 -0.018898090
## ratio_of_id_ig 0.106615045 0.054662567
## n_at_percent 0.356551400 0.246882690
## c_at_percent 1.000000000 0.420571987
## o_at_percent 0.420571987 1.000000000
## electrolyte_ionic_conductivity 0.115467105 0.025287644
## electrolyte_concentration_m 0.074817587 0.022279305
## cell_configuration_three_two_electrode_system_encoded 0.176837372 -0.045597510
## electrolyte_ionic_conductivity
## lower_limit_of_potential_window_v 0.112382988
## upper_limit_of_potential_window_v 0.083388496
## current_density_a_g -0.069069899
## capacitance_f_g 0.064289883
## specific_surface_area_m_2_g -0.017146514
## charge_transfer_resistance_rct_ohm 0.047268210
## equivalent_series_resistance_rs_ohm 0.093843964
## pore_size_nm -0.078837487
## pore_volume_cm_3_g -0.093947644
## ratio_of_id_ig 0.186849884
## n_at_percent -0.098991322
## c_at_percent 0.115467105
## o_at_percent 0.025287644
## electrolyte_ionic_conductivity 1.000000000
## electrolyte_concentration_m 0.204780831
## cell_configuration_three_two_electrode_system_encoded 0.008206978
## electrolyte_concentration_m
## lower_limit_of_potential_window_v -0.24850914
## upper_limit_of_potential_window_v -0.29662625
## current_density_a_g 0.05406934
## capacitance_f_g 0.05031686
## specific_surface_area_m_2_g 0.08748501
## charge_transfer_resistance_rct_ohm -0.10481521
## equivalent_series_resistance_rs_ohm -0.08843116
## pore_size_nm -0.01476505
## pore_volume_cm_3_g 0.19190008
## ratio_of_id_ig 0.05015744
## n_at_percent -0.02140215
## c_at_percent 0.07481759
## o_at_percent 0.02227930
## electrolyte_ionic_conductivity 0.20478083
## electrolyte_concentration_m 1.00000000
## cell_configuration_three_two_electrode_system_encoded 0.02522224
## cell_configuration_three_two_electrode_system_encoded
## lower_limit_of_potential_window_v 0.224426904
## upper_limit_of_potential_window_v 0.450469081
## current_density_a_g 0.005226627
## capacitance_f_g -0.177386448
## specific_surface_area_m_2_g 0.211538077
## charge_transfer_resistance_rct_ohm -0.070966740
## equivalent_series_resistance_rs_ohm 0.078308068
## pore_size_nm -0.020538806
## pore_volume_cm_3_g 0.102044281
## ratio_of_id_ig 0.048310043
## n_at_percent -0.034833948
## c_at_percent 0.176837372
## o_at_percent -0.045597510
## electrolyte_ionic_conductivity 0.008206978
## electrolyte_concentration_m 0.025222238
## cell_configuration_three_two_electrode_system_encoded 1.000000000
ggcorrplot(
corr_matrix,
method = "square",
type = "lower",
lab = TRUE,
lab_size = 3.5,
tl.cex = 10,
tl.srt = 45,
colors = c("blue", "white", "red"),
outline.color = "gray30",
title = "Macierz korelacji"
)
Macierz korelacji wskazuje, że zależności liniowe między zmiennymi są stosunkowo słabe. Jednym z niewielu wyraźniejszych związków jest dodatnia korelacja między oporem transferu ładunku a szeregowym oporem wewnętrznym. Zmienna pojemność nie wykazuje jednak silnej zależności z żadną pojedynczą cechą, co sugeruje, że jej wartość wynika raczej z kombinacji wielu czynników niż z jednego dominującego parametru.
p_trend <- ggplot(
data,
aes(
x = specific_surface_area_m_2_g,
y = current_density_a_g,
color = capacitance_f_g
)
) +
geom_point(alpha = 0.8, size = 3) +
scale_color_viridis(option = "A") +
theme_minimal() +
labs(
title = "Wpływ SSA i gęstości prądu na pojemność",
x = "Specific surface area (m²/g)",
y = "Current density (A/g)",
color = "Capacitance (F/g)"
)
ggplotly(p_trend)
Wykres zależności między powierzchnią właściwą a gęstością prądu, z kolorystycznym oznaczeniem pojemności, ujawnia, że najwyższe pojemności uzyskiwane są głównie przy niskich gęstościach prądu. Pojemność silnie spada, gdy gęstość prądu rośnie, niezależnie od wartości SSA.
data_tern <- data %>%
select(n_at_percent, o_at_percent, c_at_percent) %>%
na.omit()
p_tern_plotly <- plot_ly(
data = data_tern,
a = ~c_at_percent,
b = ~n_at_percent,
c = ~o_at_percent,
type = "scatterternary",
mode = "markers",
marker = list(size = 6, opacity = 0.7, color = "steelblue")
) %>%
layout(
title = list(
text = "Wykres ternarny: proporcje tlenu, azotu i węgla w materiałach",
y = 1.08
),
ternary = list(
aaxis = list(title = "C (at. %)"),
baxis = list(title = "N (at. %)"),
caxis = list(title = "O (at. %)")
),
margin = list(t = 100)
)
p_tern_plotly
Wykres ternarny pokazujący proporcje N–C–O pozwala dostrzec, że większość analizowanych materiałów ma bardzo wysoką zawartość węgla. Zawartość azotu jest zwykle niska, a tlen występuje w zróżnicowanych ilościach, bez wyraźnej tendencji.
p_cd_cap <- ggplot(
data,
aes(
x = current_density_a_g,
y = capacitance_f_g,
color = electrolyte_concentration_m
)
) +
geom_point(size = 3, alpha = 0.7) +
scale_color_viridis(option = "C") +
theme_minimal() +
labs(
title = "Zależność: gęstość prądu i pojemność",
x = "Current density (A/g)",
y = "Capacitance (F/g)",
color = "Electrolyte conc. (M)"
)
ggplotly(p_cd_cap)
Wykres pokazuje, że pojemność silnie zależy od gęstości prądu: najwyższe wartości uzyskiwane są przy bardzo niskich obciążeniach, natomiast przy wyższych gęstościach prądu pojemność wyraźnie spada. Stężenie elektrolitu nie wykazuje jednoznacznego wpływu na wyniki.
cluster_vars <- data
preproc_cluster <- preProcess(
cluster_vars,
method = c("medianImpute", "center", "scale")
)
cluster_scaled <- predict(preproc_cluster, cluster_vars)
nb <- NbClust(
data = cluster_scaled,
distance = "euclidean",
min.nc = 2,
max.nc = 6,
method = "kmeans",
index = "all"
)
## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##
## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 5 proposed 2 as the best number of clusters
## * 1 proposed 3 as the best number of clusters
## * 2 proposed 4 as the best number of clusters
## * 9 proposed 5 as the best number of clusters
## * 6 proposed 6 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 5
##
##
## *******************************************************************
nb$Best.nc
## KL CH Hartigan CCC Scott Marriot TrCovW
## Number_clusters 5.0000 5.0000 5.0000 6.000 5.000 5.000000e+00 5.0
## Value_Index 1.7972 83.1291 26.5018 1.945 1237.639 1.188713e+45 116209.4
## TraceW Friedman Rubin Cindex DB Silhouette Duda
## Number_clusters 5.000 4.0000 5.0000 6.0000 6.0000 6.000 2.0000
## Value_Index 342.134 3.5337 -0.0304 0.2022 2.0276 0.157 1.0586
## PseudoT2 Beale Ratkowsky Ball PtBiserial Frey McClain
## Number_clusters 2.0000 2.0000 5.0000 3.000 6.0000 1 2.0000
## Value_Index -18.4953 -0.6098 0.2049 2626.547 0.3754 NA 0.6861
## Dunn Hubert SDindex Dindex SDbw
## Number_clusters 4.0000 0 6.0000 0 2.0000
## Value_Index 0.0469 0 1.4084 0 1.0383
k_opt <- 5
km_res <- kmeans(cluster_scaled, centers = k_opt, nstart = 25)
data_clustered <- data %>%
filter(rowSums(is.na(cluster_vars)) < ncol(cluster_vars)) %>%
mutate(cluster = factor(km_res$cluster))
fviz_cluster(
km_res,
data = cluster_scaled,
geom = "point",
ellipse.type = "norm",
main = "Klastry materiałów (k-means)"
)
ggplot(data_clustered, aes(x = cluster, y = capacitance_f_g, fill = cluster)) +
geom_boxplot() +
labs(
x = "Klaster",
y = "Capacitance (F/g)",
title = "Pojemność właściwa w klastrach"
)
W analizie skupień dane zostały najpierw przygotowane poprzez imputację braków i standaryzację zmiennych, aby wszystkie cechy miały porównywalny wpływ na algorytm. Następnie, z wykorzystaniem pakietu NbClust, porównano wiele różnych kryteriów oceny jakości podziału i na tej podstawie wybrano optymalną liczbę klastrów. Większość indeksów wskazała, że najbardziej sensowny podział to pięć grup.
Zastosowanie metody k-means pozwoliło na wyodrębnienie pięciu odmiennych klastrów materiałów, różniących się parametrami strukturalnymi i elektrochemicznymi. Wizualizacja klastrów pokazała, że grupy te zajmują różne obszary przestrzeni cech, co oznacza, że algorytm wychwycił realne różnice między próbkami. Analiza pojemności w klastrach ujawniła, że niektóre grupy charakteryzują się wyraźnie wyższą pojemnością właściwą niż pozostałe, co może sugerować, że łączą one materiały o korzystnych parametrach i warunkach testowych.
ml_data <- data
outer_idx <- createDataPartition(ml_data$capacitance_f_g, p = 0.7, list = FALSE)
train_outer <- ml_data[outer_idx, ]
test_outer <- ml_data[-outer_idx, ]
ctrl_inner <- trainControl(method = "cv", number = 5)
rf_model <- train(
capacitance_f_g ~ .,
data = train_outer,
method = "rf",
trControl = ctrl_inner,
preProcess = c("center", "scale"),
importance = TRUE
)
rf_model
## Random Forest
##
## 649 samples
## 15 predictor
##
## Pre-processing: centered (15), scaled (15)
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 519, 520, 518, 519, 520
## Resampling results across tuning parameters:
##
## mtry RMSE Rsquared MAE
## 2 294.2645 0.5826311 177.5622
## 8 275.1092 0.6016187 155.4912
## 15 274.3868 0.6019019 153.8237
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was mtry = 15.
pred <- predict(rf_model, test_outer)
postResample(pred, test_outer$capacitance_f_g)
## RMSE Rsquared MAE
## 223.5621594 0.7609547 137.5280183
varImp(rf_model)
## rf variable importance
##
## Overall
## upper_limit_of_potential_window_v 100.000
## lower_limit_of_potential_window_v 89.854
## electrolyte_concentration_m 75.902
## ratio_of_id_ig 53.261
## electrolyte_ionic_conductivity 45.792
## current_density_a_g 37.045
## specific_surface_area_m_2_g 32.998
## o_at_percent 30.929
## cell_configuration_three_two_electrode_system_encoded 18.006
## equivalent_series_resistance_rs_ohm 16.930
## c_at_percent 11.785
## pore_volume_cm_3_g 11.257
## n_at_percent 6.524
## pore_size_nm 3.434
## charge_transfer_resistance_rct_ohm 0.000
plot(varImp(rf_model), main = "Ważność cech w modelu Random Forest")
pred <- predict(rf_model, test_outer)
results_df <- data.frame(
Actual = test_outer$capacitance_f_g,
Predicted = pred
)
ggplot(results_df, aes(x = Actual, y = Predicted)) +
geom_point(color = "steelblue", alpha = 0.7, size = 3) +
geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed", size = 1) +
theme_minimal(base_size = 13) +
labs(
title = "Wartości rzeczywiste vs przewidywane",
subtitle = "Model Random Forest (ocena na zbiorze testowym)",
x = "Pojemność rzeczywista (F/g)",
y = "Pojemność przewidywana (F/g)"
)
pred <- predict(rf_model, test_outer)
MAE <- mean(abs(test_outer$capacitance_f_g - pred))
mean_capacitance <- mean(test_outer$capacitance_f_g, na.rm = TRUE)
error_percentage <- (MAE / mean_capacitance) * 100
cat("Średni błąd bezwzględny (MAE):", round(MAE, 2), "F/g\n")
## Średni błąd bezwzględny (MAE): 137.53 F/g
cat("Średnia pojemność w zbiorze testowym:", round(mean_capacitance, 2), "F/g\n")
## Średnia pojemność w zbiorze testowym: 410.46 F/g
cat("Średni błąd procentowy modelu:", round(error_percentage, 2), "%\n")
## Średni błąd procentowy modelu: 33.51 %
Model Random Forest został wytrenowany na danych podzielonych na część treningową i testową, z wykorzystaniem walidacji krzyżowej. Na zbiorze testowym uzyskał średni błąd około 137 F/g, co odpowiada ok. 33,5% średniej pojemności — oznacza to umiarkowaną dokładność predykcji. Analiza ważności cech pokazała, że największy wpływ na wyniki mają parametry związane z oknem potencjału, stężenie i przewodnictwo elektrolitu oraz gęstość prądu, natomiast cechy materiałowe odgrywają mniejszą rolę. Wyniki potwierdzają, że pojemność zależy głównie od warunków testowych, a duża niejednorodność danych ogranicza precyzję modelu.
Zbiór danych jest niejednorodny i zawiera wiele braków.
Zależności liniowe między zmiennymi są słabe.
Klasteryzacja ujawniła 5 wyraźnych grup materiałów, z których niektóre charakteryzują się wyższą pojemnością niż pozostałe.
Model Random Forest przewiduje pojemność ze średnim błędem ok. 33%, co wskazuje na umiarkowaną dokładność przy dużej zmienności danych.
Najważniejszymi cechami w modelu okazały się parametry związane z oknem potencjału, stężeniem i przewodnictwem elektrolitu oraz gęstością prądu.